import { OpenAPI } from '../core/OpenAPI'
import { getToken } from './apiConfig'

/**
 * 文件上传工具类
 * 专门处理 multipart/form-data 格式的文件上传
 */

export interface UploadResult {
  fileName: string
  originalFilename: string
  url: string
  size: number
}

export interface BatchUploadResult {
  fileNames: string[]
  originalFilenames: string[]
  urls: string[]
  sizes: number[]
}

export interface BaseResponse<T> {
  code: number
  data: T
  message: string
}

/**
 * 上传单个文件
 * @param file 要上传的文件
 * @returns 上传结果
 */
export const uploadFile = async (file: File): Promise<BaseResponse<UploadResult>> => {
  const formData = new FormData()
  formData.append('file', file)

  const token = getToken()
  
  const response = await fetch(`${OpenAPI.BASE}/file/upload`, {
    method: 'POST',
    headers: {
      'Authorization': `Bearer ${token}`,  // 修复：使用正确的 header 名称和格式
      // 注意：不要设置 Content-Type，让浏览器自动设置为 multipart/form-data
    },
    body: formData,
    credentials: 'include',
  })

  if (!response.ok) {
    throw new Error(`文件上传失败: ${response.statusText}`)
  }

  return await response.json()
}

/**
 * 批量上传文件
 * @param files 要上传的文件列表
 * @returns 批量上传结果
 */
export const uploadFiles = async (files: File[]): Promise<BaseResponse<BatchUploadResult>> => {
  const formData = new FormData()
  
  // 后端接收参数名为 files
  files.forEach((file) => {
    formData.append('files', file)
  })

  const token = getToken()
  
  const response = await fetch(`${OpenAPI.BASE}/file/uploads`, {
    method: 'POST',
    headers: {
      'Authorization': `Bearer ${token}`,  // 修复：使用正确的 header 名称和格式
    },
    body: formData,
    credentials: 'include',
  })

  if (!response.ok) {
    throw new Error(`批量文件上传失败: ${response.statusText}`)
  }

  return await response.json()
}

/**
 * 上传头像
 * @param file 要上传的头像文件（仅支持图片格式）
 * @returns 上传结果
 */
export const uploadAvatar = async (file: File): Promise<BaseResponse<UploadResult>> => {
  // 验证文件类型
  const allowedTypes = ['image/jpeg', 'image/jpg', 'image/png', 'image/gif', 'image/bmp']
  if (!allowedTypes.includes(file.type)) {
    throw new Error('仅支持上传图片格式（jpg、png、gif、bmp）')
  }

  const formData = new FormData()
  formData.append('file', file)

  const token = getToken()
  
  const response = await fetch(`${OpenAPI.BASE}/file/avatar`, {
    method: 'POST',
    headers: {
      'Authorization': `Bearer ${token}`,  // 修复：使用正确的 header 名称和格式
    },
    body: formData,
    credentials: 'include',
  })

  if (!response.ok) {
    throw new Error(`头像上传失败: ${response.statusText}`)
  }

  return await response.json()
}

/**
 * 上传图片（通用方法）
 * @param file 要上传的图片文件
 * @param isAvatar 是否作为头像上传（默认false）
 * @returns 上传结果
 */
export const uploadImage = async (file: File, isAvatar = false): Promise<BaseResponse<UploadResult>> => {
  // 验证是否为图片
  if (!file.type.startsWith('image/')) {
    throw new Error('请选择图片文件')
  }

  // 根据是否为头像选择不同的上传接口
  return isAvatar ? uploadAvatar(file) : uploadFile(file)
}

/**
 * 获取服务器基础地址（包含 /api 路径）
 * @returns 服务器基础地址
 */
export const getServerBaseUrl = (): string => {
  // OpenAPI.BASE 是 http://localhost:8101/api
  // 文件访问也需要通过 /api 路径
  return OpenAPI.BASE
}

/**
 * 获取完整的文件访问URL（用于回显）
 * @param relativePath 相对路径，如 /native/upload/2025/11/03/xxx.png
 * @returns 完整的访问URL，如 http://localhost:8101/api/native/upload/2025/11/03/xxx.png
 */
export const getFileUrl = (relativePath: string): string => {
  if (!relativePath) return ''
  
  // 如果已经是完整URL，直接返回
  if (relativePath.startsWith('http://') || relativePath.startsWith('https://')) {
    return relativePath
  }
  
  // 拼接完整URL：服务器基础地址 + 相对路径
  // 例如：http://localhost:8101/api + /native/upload/2025/11/03/xxx.png
  const serverBaseUrl = getServerBaseUrl()
  
  // 确保路径以 / 开头
  const path = relativePath.startsWith('/') ? relativePath : `/${relativePath}`
  
  const fullUrl = `${serverBaseUrl}${path}`
  
  console.log('🔗 getFileUrl 转换:', {
    输入相对路径: relativePath,
    服务器基础地址: serverBaseUrl,
    完整URL: fullUrl
  })
  
  return fullUrl
}


